package com.meihuayishu.backend.util;

import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * 真太阳时计算器
 */
@Component
public class SolarTimeCalculator {
    
    // 中国标准时间的经度（东经120度）
    private static final double CHINA_STANDARD_LONGITUDE = 120.0;
    
    /**
     * 计算真太阳时偏差（分钟）
     * @param dateTime 日期时间
     * @param longitude 经度
     * @return 真太阳时偏差（分钟）
     */
    public int calculateSolarTimeOffset(LocalDateTime dateTime, double longitude) {
        // 计算经度偏差导致的时间差（每经度4分钟）
        double longitudeOffset = (longitude - CHINA_STANDARD_LONGITUDE) * 4;
        
        // 计算日期方程（简化版）
        int dayOfYear = dateTime.getDayOfYear();
        double equationOfTime = calculateEquationOfTime(dayOfYear);
        
        // 总偏差（分钟）
        return (int) Math.round(longitudeOffset + equationOfTime);
    }
    
    /**
     * 计算日期方程（简化版）
     * @param dayOfYear 一年中的第几天
     * @return 日期方程值（分钟）
     */
    private double calculateEquationOfTime(int dayOfYear) {
        // 简化的日期方程计算，实际应使用更精确的天文算法
        double b = 2 * Math.PI * (dayOfYear - 81) / 365.0;
        return 9.87 * Math.sin(2 * b) - 7.53 * Math.cos(b) - 1.5 * Math.sin(b);
    }
    
    /**
     * 根据出生地经度调整时间
     * @param dateTime 原始日期时间
     * @param birthLocation 出生地（格式：城市名或经度值）
     * @return 调整后的日期时间
     */
    public LocalDateTime adjustTimeByLocation(LocalDateTime dateTime, String birthLocation) {
        // 获取经度（简化处理，实际应有地理编码服务）
        double longitude = extractLongitude(birthLocation);
        
        // 计算偏差（分钟）
        int offsetMinutes = calculateSolarTimeOffset(dateTime, longitude);
        
        // 调整时间
        return dateTime.plusMinutes(offsetMinutes);
    }
    
    /**
     * 从位置信息中提取经度
     * @param location 位置信息
     * @return 经度值
     */
    private double extractLongitude(String location) {
        // 简化处理，实际应使用地理编码服务
        // 这里假设一些主要城市的经度
        Map<String, Double> cityLongitudes = new HashMap<>();
        cityLongitudes.put("北京", 116.4);
        cityLongitudes.put("上海", 121.5);
        cityLongitudes.put("广州", 113.3);
        cityLongitudes.put("深圳", 114.1);
        cityLongitudes.put("成都", 104.1);
        cityLongitudes.put("杭州", 120.2);
        cityLongitudes.put("武汉", 114.3);
        cityLongitudes.put("西安", 108.9);
        cityLongitudes.put("重庆", 106.5);
        cityLongitudes.put("南京", 118.8);
        
        // 尝试直接解析为经度值
        try {
            return Double.parseDouble(location);
        } catch (NumberFormatException e) {
            // 如果不是数字，尝试从城市映射中获取
            return cityLongitudes.getOrDefault(location, CHINA_STANDARD_LONGITUDE);
        }
    }
}